package dawn.jxufe.community.controller;

import com.sun.media.jfxmediaimpl.HostUtils;
import dawn.jxufe.community.dao.AlphaDao;
import dawn.jxufe.community.service.AlphaService;
import dawn.jxufe.community.util.CommunityUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;

/**
 * @author dawn21
 * @version 1.0
 * @date 2022/6/22 16:47
 * @component
 */
@Controller
@RequestMapping("/alpha")
public class AlphaController {

    @Autowired
    private AlphaService alphaService;

    @RequestMapping("/hello")
    @ResponseBody
    public String sayHello(){
        return "hello Spring Boot.";
    }
    @RequestMapping("/data")
    @ResponseBody
    public String getData(){
        return alphaService.find();
    }
    @RequestMapping("/http")
    public void http(HttpServletRequest request, HttpServletResponse response){
        //获取请求数据
        System.out.println(request.getMethod());
        System.out.println(request.getServletPath());

        //请求的消息头
        Enumeration<String> enumeration = request.getHeaderNames();
        while (enumeration.hasMoreElements()){
            String name = enumeration.nextElement();
            String value = request.getHeader(name);
            System.out.println(name + ":"+ value);
        }

        System.out.println(request.getParameter("code"));

        //返回响应数据
        //设置类型
        response.setContentType("text/html;charset=utf-8");
        //响应的输出流
        try(
                PrintWriter writer =  response.getWriter();//自动关闭流，省的写finally
                ) {
            writer.write("<h1>牛客网<h1>"); //输出网页的一部分，应该写完整
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //如何处理请求和返回数据
    //GET请求

    // /students?current=1&limit=20 分页显示,当前第1页，每页20行
    @RequestMapping(path="/students", method= RequestMethod.GET)//强制GET方式才可以访问
    @ResponseBody
    public String getStudents( //参数名，false表示可以没有参数，没有传参数默认值是1
            @RequestParam(name = "current", required = false, defaultValue = "1") int current,
            @RequestParam(name = "limit", required = false, defaultValue = "1") int limit
    ){ //参数一致就行
        System.out.println(current);
        System.out.println(limit);
        return "获取所有学生的信息！";
    }

    @RequestMapping(path = "/student/{id}", method = RequestMethod.GET)
    @ResponseBody
    public String getStudent(@PathVariable("id") int id){ //获取路径变量
        System.out.println(id);
        return "a student";
    }

    //POST请求
    @RequestMapping(path = "/student", method = RequestMethod.POST)
    @ResponseBody
    public String saveStudent(String name, int age){
        System.out.println(name);
        System.out.println(age);
        return "save a student";
    }

    //响应html数据
    @RequestMapping("/teacher")
    public ModelAndView getStudent(){
        ModelAndView mav = new ModelAndView();
        mav.addObject("name","张三"); //参数名，参数值
        mav.addObject("age","18"); //参数名，参数值
        //设置模板的名字和路径
        mav.setViewName("/demo/view"); //模板默认放在templates
        return mav;
    }

    @RequestMapping("/school")
    public String getSchool(Model model){
        model.addAttribute("name","清华大学"); //参数名，参数值
        model.addAttribute("age","115"); //参数名，参数值
        return "/demo/view";
    }

    //响应json(异步请求)
    //java对象 -> json字符串 -> js对象
    //返回一个员工，这样写会自动转。
    @RequestMapping(path = "/emp", method = RequestMethod.GET)
    @ResponseBody
    public Map<String,Object> getEmp(){
        Map<String,Object> emp = new HashMap<>();
        emp.put("name","李四");
        emp.put("age",23);
        emp.put("salary",25000.00);
        return emp;
    }

    //返回一组员工，这样写会自动转。
    @RequestMapping(path = "/emps", method = RequestMethod.GET)
    @ResponseBody
    public List<Map<String,Object>> getEmps(){
        List<Map<String,Object>> list = new ArrayList<>();

        Map<String,Object> emp = new HashMap<>();
        emp.put("name","李四");
        emp.put("age",23);
        emp.put("salary",25000.00);
        list.add(emp);

        emp = new HashMap<>();
        emp.put("name","王五");
        emp.put("age",24);
        emp.put("salary",25000.00);
        list.add(emp);

        emp = new HashMap<>();
        emp.put("name","赵六");
        emp.put("age",26);
        emp.put("salary",25000.00);
        list.add(emp);

        return list;

    }

    // cookie实例，服务端代码。cookie是保存在response中的，和返回的是字符串还是网页无关。
    @RequestMapping(path = "/cookie/set", method = RequestMethod.GET)
    @ResponseBody
    public String setCookie(HttpServletResponse response) {
        // 创建cookie，每个cookie只能存一对值。
        Cookie cookie = new Cookie("code", CommunityUtil.generateUUID());
        // 设置cookie的有效范围(在它的路径和子路径下才有效)。
        cookie.setPath("/community/alpha");
        // 服务器发动给浏览器的cookie默认存在内存中，若关闭电脑，cookie就会删除。
        // 则设置cookie生存时间，那么cookie就会被保存在硬盘中，生存周期内有效。
        // 设置cookie存在时间，单位为秒。
        cookie.setMaxAge(60 * 10);
        // 发送cookie，在这之前将cookie放在response的头中。
        response.addCookie(cookie);
        // 启动服务器，依赖浏览器插件查看cookie是否存在。
        // 启动服务，在浏览器地址栏输入地址，点击F12，看网络，刷新地址栏，右边中的消息头就可以看到cookie的信息。
        return "set cookie.";
    }

    // 在请求中加上已经有的cookie。
    // 获取已有的众多cookie中的一个。
    @RequestMapping(path = "/cookie/get", method = RequestMethod.GET)
    @ResponseBody
    public String getCookie(@CookieValue("code") String code){
        System.out.println(code);
        return "get cookie.";
    }

    /** 浏览器和服务器会话时，服务器只在第一次设置cookie，然后在response中添加cookie返回给浏览器，
     * 服务器请求时每次的cookie都一样了，每次cookie都加在请求头中，这时，每次浏览器响应时就不在response中加cookie了，
     * cookie只是为了服务器识别浏览器。当然若浏览器调用了设置cookie的方法也可以重新设置cookie，但是一般就设置一次。
     *
     * Session
     * 是JavaEE的标准，用于在服务端记录客户端信息。
     * 数据存放在服务端更加安全，但是也会增加服务端的内存压力。
     * 隐私的数据就用session，没那么重要的数据就用cookie。
     * session本质上是依赖于cookie的。
     *
     */

    // session实例
    @RequestMapping(path = "/session/set", method = RequestMethod.GET)
    @ResponseBody
    public String setSession(HttpSession session){
        session.setAttribute("id", 1);
        session.setAttribute("name", "test");
        return "set session.";
    }

    // session实例
    @RequestMapping(path = "/session/get", method = RequestMethod.GET)
    @ResponseBody
    public String getSession(HttpSession session){
        System.out.println(session.getAttribute("id"));
        System.out.println(session.getAttribute("name"));
        return "get session.";
    }

    // Ajax示例
    @RequestMapping(path = "/ajax", method = RequestMethod.POST)
    @ResponseBody
    public String testAjax(String name, int age){
        System.out.println(name);
        System.out.println(age);
        return CommunityUtil.getJSONString(0, "操作成功！");
    }

}
